/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package CapaPersistencia;

import CapaLogica.GestionResort;
import CapaDatos.Nomina;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;


/**
 * Clase de persistencia de implementacion DAO con tecnologia
 * XML para el dominio de Cliente
 * @author gerardobarcia
 */
public class DAONominaXML implements IDAONomina {

    /** variable que contiene la raiz del documento Xml*/
    private Element root;
    /** variable que contiene la localizacion del archivo xml*/

    private String fileLocation = "C:/ArchivosXml/Nominas.xml";


    /**
     * constructor por defecto que inicia los valores para trabajar con el documento
     * xml
     */
    public DAONominaXML() {
        try {
            SAXBuilder builder = new SAXBuilder(false);
            Document doc = null;
            doc = builder.build(fileLocation);
            root = doc.getRootElement();
        } catch (JDOMException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        }
    }

    /**
     * firma para pasar un objeto de dominio cliente a un elemento entendible
     * por la libreria jdom para dar soporte al trabajo con xml
     * @param nomina objeto cliente a traducir
     * @return objeto tipo element para el xml
     */
    private Element nominatoXmlElement(Nomina nomina) {
        Element nominaTrans = new Element("nomina");
        Element nombre = new Element("nombre");
        nombre.setText(nomina.getNombre());
        Element apellido = new Element("apellido");
        apellido.setText(nomina.getApellido());
        Element cedula = new Element("cedula");
        cedula.setText(nomina.getCedula());
        Element nacionalidad = new Element("nacionalidad");
        nacionalidad.setText(nomina.getNacionalidad());
        Element sexo = new Element("sexo");
        sexo.setText(nomina.getSexo());
        Element fechaNac = new Element("fechaNac");
        fechaNac.setText(nomina.getFechaNac());
        Element edoCivil = new Element("edoCivil");
        edoCivil.setText(nomina.getEdoCivil());
        Element numHijos = new Element("numHijos");
        numHijos.setText(nomina.getNumHijos());
        Element sueldo = new Element("sueldo");
        sueldo.setText(Double.toString(nomina.getSueldo()));
        Element descripcionCargo = new Element("descripcionCargo");
        descripcionCargo.setText(nomina.getDescripcionCargo());
        Element horario = new Element("horario");
        horario.setText(nomina.getHorario());

        nominaTrans.addContent(nombre);
        nominaTrans.addContent(apellido);
        nominaTrans.addContent(cedula);
        nominaTrans.addContent(nacionalidad);
        nominaTrans.addContent(sexo);
        nominaTrans.addContent(fechaNac);
        nominaTrans.addContent(edoCivil);
        nominaTrans.addContent(numHijos);
        nominaTrans.addContent(sueldo);
        nominaTrans.addContent(descripcionCargo);
        nominaTrans.addContent(horario);
        return nominaTrans;
    }

//    /**
//     * firma para pasar de on objeto de tipo elemento a un objeto de dominio
//     * para dar soporte a la aplicacion
//     * @param element elemento a traducir
//     * @return objeto de dominio cliente
//     */
    private Nomina nominaToObject(Element element) throws ParseException {
        Nomina nomina = new Nomina();
        nomina.setNombre(element.getChildText("nombre"));
        nomina.setApellido(element.getChildText("apellido"));
        nomina.setCedula(element.getChildText("cedula"));
        nomina.setNacionalidad(element.getChildText("nacionalidad"));
        nomina.setSexo(element.getChildText("sexo"));
        nomina.setFechaNac(element.getChildText("fechaNac"));
        nomina.setEdoCivil(element.getChildText("edoCivil"));
        nomina.setNumHijos(element.getChildText("numHijos"));
        nomina.setSueldo(Double.parseDouble(element.getChildText("sueldo").toString()));
        nomina.setDescripcionCargo(element.getChildText("descripcionCargo"));
        nomina.setHorario(element.getChildText("horario"));
        element.getChildText(fileLocation);
        return nomina;
    }
//
//    /**
//     * Operacion para guardar en el documento Xml los cambios efectuados
//     * @return true si se cumplio la operacion con exito, false en caso contrario
//     */
    private boolean updateDocument() {
        try {
            XMLOutputter out = new XMLOutputter();
            FileOutputStream file = new FileOutputStream(fileLocation);
            out.output(root, file);
            file.flush();
            file.close();
            return true;
        } catch (Exception e) {
            System.out.println("error: " + e.getMessage());
            return false;
        }
    }
//
//    /**
//     * Operacion que busca un elemento que cumpla con una condicion en el id del xml
//     * @param raiz la raiz del documento xml
//     * @param dato el dato a comparar para la busqueda del elemento. Debe ser el identificador
//     * @return retorna el elemento si existe con la condicion, en caso contrario retorna null
//     */
    public static Element buscar(List raiz, String dato) {
        Iterator i = raiz.iterator();
        while (i.hasNext()) {
            Element e = (Element) i.next();
            if (dato.equals(e.getChild("cedula").getText())) {
                return e;
            }
        }
        return null;
    }
//
//    /**
//     * firma para agregar un nuevo cliente
//     * @param cliente objeto cliente a agregar
//     * @return valor boleano con la condicion de exito
//     */
    public boolean agregarNomina(Nomina nomina) {
        boolean resultado = false;
        root.addContent(nominatoXmlElement(nomina));
        resultado = updateDocument();
        GestionResort.getLasNominas().agregarElemento(nomina);
        return resultado;
    }
//
//    /**
//     * firma para buscar un cliente
//     * @param cedula numero de cedula del cliente a buscar
//     * @return objeto cliente con sus datos segun busqueda
//     */
    public Nomina buscarNomina(String cedula) {
        Element aux = new Element("nomina");
        List salones = this.root.getChildren("nomina");
        while (aux != null) {
            aux = DAONominaXML.buscar(salones,cedula);
            if (aux != null) {
                try {
                    return nominaToObject(aux);
                } catch (ParseException ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }
        return null;
    }
//
//    /**
//     * firma para actualizar un cliente
//     * @param cliente objeto cliente a actualizar
//     * @return valor boleano con la condicion de exito
//     */
    public boolean actualizarNomina(Nomina nomina) {
        boolean resultado = false;
        Element aux = new Element("nomina");
        List salones = this.root.getChildren("nomina");
        while (aux != null) {
            aux = DAONominaXML.buscar(salones,nomina.getCedula());
            if (aux != null) {
                salones.remove(aux);
                resultado = updateDocument();
            }
        }
        GestionResort.getLasNominas().agregarElemento(nomina);
        agregarNomina(nomina);
        return resultado;
    }
//
//    /**
//     * firma para borrar un cliente
//     * @param cedula cedula del cliente a borrar
//     * @return valor boleano con la condicion de exito
//     */
    public boolean borrarNomina(String cedula) {
        boolean resultado = false;
        Element aux = new Element("nomina");
        List salones = this.root.getChildren("nomina");
        while (aux != null) {
            aux = DAONominaXML.buscar(salones,cedula);
            if (aux != null) {
                salones.remove(aux);
                GestionResort.getLasNominas().eliminarNominaPorCedula(Integer.parseInt(cedula));
                resultado = updateDocument();
            }
        }
        return resultado;
    }
//
//    /**
//     * firma para obtener todos los clientes //dile a carlos que acomode eso.. dice cli
//     * @return ArrayList con todos los objetos nomina
//     */
    public ArrayList<Nomina> todaLaNomina() {
        ArrayList<Nomina> resultado = new ArrayList<Nomina>();
        for (Object it : root.getChildren()) {
            Element xmlElem = (Element) it;
            try {
                resultado.add(nominaToObject(xmlElem));
            } catch (ParseException ex) {
                System.out.println(ex.getMessage());
            }
        }
        return resultado;
    }
}

